package jp.syuriken.snsw.terenaibot.internal;

/**
 * クロッカ。
 * 
 * @author $Author: snswinhaiku.lo@gmail.com $
 */
public class Clocker extends Thread {
	
	private boolean isFinish = false;
	
	private long clockInterval;
	
	private volatile ThreadHolder target;
	
	private ThreadHolder clockerHolder;
	

	/**
	 * インスタンスを生成する。
	 * 
	 * @param holder スレッドホルダ（同期用）
	 * @param clockInterval クロックを生成する間隔
	 */
	public Clocker(ThreadHolder holder, long clockInterval) {
		target = holder;
		clockerHolder = new ThreadHolder();
		this.clockInterval = clockInterval;
	}
	
	@Override
	public void run() {
		while (!isFinish) {
			try {
				synchronized (clockerHolder) {
					if (!isFinish) {
						clockerHolder.wait(clockInterval);
					}
				}
			} catch (InterruptedException e) {
				// do nothing
			}
			synchronized (target) {
				target.notifyAll();
			}
		}
	}
	
	/**
	 * クロックを止める。実際に停止したかどうかは{@link #join()}などを使ってください。
	 */
	public void stopClocker() {
		isFinish = true;
		synchronized (clockerHolder) {
			clockerHolder.notifyAll();
		}
	}
}
